/**
 * 统一错误处理类
 * 负责处理应用中的各种错误类型
 */

import { BUSINESS_CODE } from './config.js'
import store from './store.js'

class ErrorHandler {
  /**
   * 处理错误
   * @param {Error} error - 错误对象
   * @param {Object} options - 配置选项
   */
  static handle(error, options = {}) {
    const { showToast = true, redirectToLogin = true } = options

    // 获取错误信息
    const { code, message } = this.parseError(error)

    // 根据错误类型处理
    switch (code) {
      case BUSINESS_CODE.TOKEN_EXPIRED:
      case BUSINESS_CODE.UNAUTHORIZED:
        this.handleUnauthorized(redirectToLogin)
        break

      case BUSINESS_CODE.PERMISSION_DENIED:
        this.handlePermissionDenied()
        break

      case BUSINESS_CODE.VALIDATION_ERROR:
        if (showToast) {
          uni.showToast({
            title: message || '参数错误',
            icon: 'none'
          })
        }
        break

      case BUSINESS_CODE.INTERNAL_SERVER_ERROR:
        if (showToast) {
          uni.showToast({
            title: '服务器错误，请重试',
            icon: 'none'
          })
        }
        break

      case BUSINESS_CODE.SERVICE_UNAVAILABLE:
        if (showToast) {
          uni.showToast({
            title: '服务暂不可用，请稍后重试',
            icon: 'none'
          })
        }
        break

      default:
        // 默认错误处理
        if (showToast && message) {
          uni.showToast({
            title: message,
            icon: 'none'
          })
        }
    }

    // 记录错误日志
    this.logError(error, code, message)
  }

  /**
   * 解析错误信息
   * @param {Error} error - 错误对象
   * @returns {Object} 错误信息
   */
  static parseError(error) {
    // 如果是业务错误
    if (error.code !== undefined) {
      return {
        code: error.code,
        message: error.message || '未知错误'
      }
    }

    // 如果是HTTP错误
    if (error.response) {
      const { status, data } = error.response
      return {
        code: status,
        message: data?.message || `请求失败 (${status})`
      }
    }

    // 如果是网络错误
    if (error.request) {
      return {
        code: -1,
        message: '网络连接失败，请检查网络设置'
      }
    }

    // 默认错误
    return {
      code: -1,
      message: error.message || '未知错误'
    }
  }

  /**
   * 处理未授权错误
   * @param {boolean} redirectToLogin - 是否跳转到登录页
   */
  static handleUnauthorized(redirectToLogin = true) {
    // 清除用户信息
    try {
      store.actions.clearUserInfo()
    } catch (error) {
      // 清除失败也继续执行
    }

    // 跳转到登录页
    if (redirectToLogin) {
      setTimeout(() => {
        uni.reLaunch({
          url: '/pages/account/login'
        })
      }, 1500)
    }
  }

  /**
   * 处理权限不足错误
   */
  static handlePermissionDenied() {
    uni.showToast({
      title: '权限不足，无法执行此操作',
      icon: 'none'
    })
  }

  /**
   * 记录错误日志
   * @param {Error} error - 错误对象
   * @param {number} code - 错误码
   * @param {string} message - 错误信息
   */
  static logError(error, code, message) {
    // 在开发环境打印错误信息
    if (process.env.NODE_ENV !== 'production') {
      console.error('❌ 错误处理:', {
        code,
        message,
        error: error.stack || error.toString()
      })
    }

    // TODO: 在生产环境可以上报到错误监控系统
  }

  /**
   * 创建Promise错误处理包装器
   * @param {Promise} promise - Promise对象
   * @param {Object} options - 配置选项
   * @returns {Promise}
   */
  static async wrap(promise, options = {}) {
    try {
      return await promise
    } catch (error) {
      this.handle(error, options)
      throw error
    }
  }
}

export default ErrorHandler
